package com.lilicould.controller;

import com.google.gson.Gson;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.lang.reflect.Method;

/**
 * @author lilicould
 * 创建时间: 2025/9/29 17.05
 * 基础Servlet类，提供通用的请求分发机制。
 * 通过解析请求URL中的方法名，利用反射机制动态调用相应的处理方法。
 */

public class BaseServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        try {
            // 获取请求路径
            String url = req.getRequestURI();
            // 获取方法名
            String methodName = url.substring(url.lastIndexOf("/") + 1);
            // 获取指定类的字节码对象
            Class<? extends BaseServlet> clazz = this.getClass();
            // 通过类的字节码对象获取方法的字节码对象
            Method method = clazz.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            // 让方法执行
            method.invoke(this, req, resp);
        } catch (NoSuchMethodException e) {
            resp.setStatus(HttpServletResponse.SC_NOT_FOUND);
            resp.getWriter().write(new Gson().toJson("请求URL不存在"));
        } catch (Exception e) {
            resp.setStatus(HttpServletResponse.SC_NOT_FOUND);
            resp.getWriter().write(new Gson().toJson(e.getMessage()));
        }

    }
}
